'use strict';
var vk; // 全局vk实例
// 涉及的表名
const dbName = require("../../../dao/config.js");

var db = uniCloud.database(); // 全局数据库引用
var _ = db.command; // 数据库操作符
var $ = _.aggregate; // 聚合查询操作符
/**
 * 权限注意：访问以下链接查看
 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#内置权限
 */
var cloudObject = {
	isCloudObject: true, // 标记为云对象模式
	/**
	 * 请求前处理，主要用于调用方法之前进行预处理，一般用于拦截器、统一的身份验证、参数校验、定义全局对象等。
	 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#before-预处理
	 */
	_before: async function() {
		vk = this.vk; // 将vk定义为全局对象
		// let { customUtil, uniID, config, pubFun } = this.getUtil(); // 获取工具包
	},
	/**
	 * 请求后处理，主要用于处理本次调用方法的返回结果或者抛出的错误
	 * 文档地址：https://vkdoc.fsq.pub/client/uniCloud/cloudfunctions/cloudObject.html#after-后处理
	 */
	_after: async function(options) {
		let { err, res } = options;
		if (err) {
			return; // 如果方法抛出错误，直接return;不处理
		}
		return res;
	},
	/**
	 * 获取列表
	 * @url admin/business/sys.coupon.getList 前端调用的url参数地址
	 */
	getList: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		res = await vk.daoCenter.mallCouponDao.getTableData({
			data,
			whereJson: {
				status: _.in([0, 1])
			}
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 获取单个详情
	 * @url admin/business/sys.coupon.find 前端调用的url参数地址
	 */
	find: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let { _id } = data;
		let info = await vk.daoCenter.mallCouponDao.findById(_id);
		if (!info) return { code: -1, msg: "该优惠券不存在" };
		if (info.status === -1) return { code: -1, msg: "该优惠券已删除" };
		res.info = info;
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 添加和修改
	 * @url admin/business/sys.coupon.addUpdate 前端调用的url参数地址
	 */
	addUpdate: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			mode,
			_id,
			status,
			name,
			type,
			receive_start_time,
			receive_end_time,
			effective_time_rule,
			receive_rule,
			share_info,
			stock,
			allow_share = false,
			allow_give = false,
			only_original_price_use = true,
			is_public = false,
			limit = 1,
			coupon_rule,
			describe,
			remark,
			available_range_rule,
			sort = 0,
		} = data;

		let coupon_rule_msg = "";

		if (type === 1) {
			// 满减券
			if (coupon_rule.discount_amount <= 0) {
				return { code: -1, msg: "优惠金额必须大于0" };
			}
			if (coupon_rule.min_amount > 0) {
				coupon_rule_msg = `满${vk.pubfn.toDecimal(coupon_rule.min_amount / 100, 2)}减${vk.pubfn.toDecimal(coupon_rule.discount_amount / 100, 2)}`;
			} else {
				coupon_rule_msg = `立减${vk.pubfn.toDecimal(coupon_rule.discount_amount / 100 , 2)}`;
			}
		} else if (type === 2) {
			// 折扣券
			if (coupon_rule.discount_proportion <= 0 || coupon_rule.discount_proportion >= 1) {
				return { code: -1, msg: "折扣错误，不可以是10折或0折" };
			}
			if (coupon_rule.min_amount > 0) {
				coupon_rule_msg = `满${vk.pubfn.toDecimal(coupon_rule.min_amount / 100, 2)}打${vk.pubfn.discountFilter(coupon_rule.discount_proportion)}`;
			} else {
				coupon_rule_msg = `打${vk.pubfn.discountFilter(coupon_rule.discount_proportion)}`;
			}
		}

		let dataJson = {
			status,
			name,
			receive_start_time,
			receive_end_time,
			effective_time_rule,
			receive_rule,
			share_info,
			stock,
			allow_share,
			allow_give,
			only_original_price_use,
			is_public,
			limit,
			describe,
			remark,
			available_range_rule,
		};
		if (mode === "add") {
			// 添加
			vk.pubfn.objectAssign(dataJson, {
				type,
				coupon_rule,
				coupon_rule_msg,
				sort
			});
			_id = await vk.daoCenter.mallCouponDao.add(dataJson);
			res.msg = "添加成功";
		} else {
			// 修改并返回修改后的数据
			res.info = await vk.daoCenter.mallCouponDao.updateAndReturn({
				whereJson: {
					_id
				},
				dataJson
			});
			res.num = res.info ? 1 : 0;
			res.msg = "修改成功";
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 删除
	 * @url admin/business/sys.coupon.delete 前端调用的url参数地址
	 */
	delete: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id
		} = data;
		// 如果有用户已经领取过优惠券,则逻辑删除
		let num = await vk.daoCenter.userCouponDao.count({
			coupon_id: _id
		});
		if (num > 0) {
			// 逻辑删除
			await vk.daoCenter.mallCouponDao.updateById(_id, {
				status: -1,
				status_time: Date.now
			});
		} else {
			// 真实删除
			await vk.daoCenter.mallCouponDao.deleteById(_id);
		}
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 赠送优惠券给指定用户
	 * @url admin/business/sys.coupon.giveCoupon 前端调用的url参数地址
	 */
	giveCoupon: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			num,
			user_id
		} = data;

		res = await vk.daoCenter.userCouponDao.addCoupon({
			coupon_id: _id, // 优惠券id
			user_id: user_id, // 用户id
			num: num, // 发放数量
			source: 1, // 来源 0：自主领取 1：商家主动赠送 2：系统发放（如活动赠送等）
			remark: `商家发放`, // 发放备注
		});

		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改一些开关参数
	 * @url admin/business/sys.coupon.updateBySwitch 前端调用的url参数地址
	 */
	updateBySwitch: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id,
			allow_share,
			allow_give,
			is_public,
			only_original_price_use
		} = data;
		await vk.daoCenter.mallCouponDao.updateById(_id, {
			allow_share,
			allow_give,
			is_public,
			only_original_price_use
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 修改优惠券排序
	 * @url admin/business/sys.coupon.updateGoodsSort 前端调用的url参数地址
	 */
	updateGoodsSort: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------
		let {
			_id, // 商品id
			sort,
		} = data;
		if (vk.pubfn.isNullOne(_id, sort)) {
			return { code: -1, msg: '参数错误' };
		}
		if (isNaN(sort)) {
			return { code: -1, msg: 'sort必须是数字' };
		}
		await vk.daoCenter.mallCouponDao.updateById(_id, {
			sort: Number(sort)
		});
		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
	/**
	 * 模板函数
	 * @url admin/business/sys.coupon.test 前端调用的url参数地址
	 */
	test: async function(data) {
		let res = { code: 0, msg: '' };
		// 业务逻辑开始-----------------------------------------------------------


		// 业务逻辑结束-----------------------------------------------------------
		return res;
	},
};

module.exports = cloudObject;
